6552
21653
I dag efter timers debugging lærte jeg denne regel på den hårde måde:
Et overordnet element er aldrig i stand til at dække (stablet oven på) sit underordnede element, hvis forælderen har et z-indeks af en hvilken som helst værdi, uanset hvordan du ændrer barnets CSS
Hvordan kan jeg forstå denne adfærd ved logik? Er det i specifikationerne?
.container {
bredde: 600 px
højde: 600 px;
baggrundsfarve: laks;
position: relativ;
z-indeks: 99;
polstring-top: 10 px;
}
h1 {
baggrundsfarve: lyserød;
position: relativ;
z-indeks: -1;
font-familie: monospace;
}

1. Jeg kan aldrig blive dækket af forælder, hvis mit z-indeks er positivt.

2. Selv når mit z-indeks er nagativt, kan jeg stadig ikke dækkes, hvis min forælder overhovedet har noget z-indeks.

Der er to vigtige ting, du har brug for at vide: malebestilling og stablingskontekst. Hvis du henviser til specifikationen, kan du finde ud af, hvordan og hvornår elementer males.
Stablesammenhæng dannet af placerede efterkommere med negative z-indekser (ekskl. 0) i z-indeksrækkefølge (mest negative først) og derefter trærækkefølge.
Alle placerede, uigennemsigtige eller transformere efterkommere, i trærækkefølge, der falder i følgende kategorier:
Alle placerede efterkommere med 'z-index: auto' eller 'z-index: 0', i trærækkefølge.
Stablingskontekster dannet af placerede efterkommere med z-indekser større end eller lig med 1 i z-indeksrækkefølge (mindste først) derefter trærækkefølge.
Det fremgår tydeligt af dette, at vi først maler elementer med negativt z-indeks i trin (3), derefter det ene med z-indeks lig med 0 i trin (8) og endelig dem med positivt z-indeks ved trin (9) , hvilket er logisk. Vi kan også læse i en anden del af specifikationen:
Hver kasse hører til en stablingskontekst. Hvert felt i en given stablingskontekst har et helt stakniveau, som er dets position på z-aksen i forhold til andre felter i den samme stablingskontekst. Kasser med større stakniveauer er altid formateret foran kasser med lavere stakniveauer. Kasser kan have negative stakniveauer. Kasser med samme stakniveau i stablingskontekst stables fra bund til top i henhold til dokumenttrærækkefølge.
Også
Et element, der opretter en lokal stablingskontekst, genererer et felt, der har to stakniveauer: et til den stablingskontekst, det opretter (altid 0), og et til den stablingskontekst, det tilhører (givet af egenskaben z-index).
For at forstå hvornår hvert element males, skal du kende dets stablingskontekst og dets stakniveau inden for denne stablingskontekst (defineret af z-index). Du skal også vide, om dette element opretter en stablingskontekst. Dette er den vanskelige del, fordi indstilling af z-index vil gøre dette:
For en positioneret boks angiver z-index-egenskaben:
Boksen stakniveau i den aktuelle stablingskontekst.
Om kassen opretter en stablingskontekst
Værdier har følgende betydninger:

Dette heltal er stakniveauet for det genererede felt i den aktuelle stablingskontekst. Boksen etablerer også en ny stablingskontekst.
auto
Stakniveauet for det genererede felt i den aktuelle stablingskontekst er 0. Boksen opretter ikke en ny stablingskontekst, medmindre det er rodelementet.
Nu har vi alle oplysninger for bedre at forstå hver enkelt sag. Hvis det overordnede element har en z-indeksværdi på noget andet end auto, vil det skabe en stablingskontekst, således at underelementet males inden i, hvad deres z-indeks er (negativ eller positiv). Z-indekset for underordnet element fortæller os simpelthen rækkefølgen af ​​maleri inde i det overordnede element (dette dækker dit andet punkt).
Hvis kun barnelementet nu har et positivt z-indeks, og vi ikke sætter noget på det overordnede element, så overvejer man at male rækkefølgen, vil barnet blive malet senere (i trin (9)) og forælderen i trin (8). Den eneste logiske måde at male forældrene ovenfor er at øge z-indekset, men ved at gøre dette får vi os til at falde ind i det foregående tilfælde, hvor forældrene vil etablere en stablingskontekst, og underordnet element hører til det.
Der er ingen måde at have forældrene over et underordnet element, når barnet indstiller et positivt z-indeks. Der er heller ingen måde at have forældrene over barnet, hvis vi indstiller et z-indeks til det overordnede element, der adskiller sig fra auto (enten positiv eller negativ) .1
Det eneste tilfælde, hvor vi kan have et barn under dets forælder, er at indstille et negativt z-indeks på underelementet og holde forældrene ved z-indekset: auto, så denne opretter ikke en stablingskontekst og efter malebestilling barnet males først.
Ud over z-indeks er der andre egenskaber, der skaber en stablingskontekst. Hvis du står over for en forventet stablingsrækkefølge, skal du også overveje disse egenskaber for at se, om der er oprettet en stabelkontekst.
Nogle vigtige fakta, som vi kan konkludere ud fra ovenstående:
Stablingskontekster kan indeholdes i andre stabelskontekster og skaber sammen et hierarki af stablingskontekster.
Hver stablingskontekst er fuldstændig uafhængig af sine søskende: kun efterkommende elementer tages i betragtning, når stabling behandles.
Hver stablingskontekst er selvstændig: Når elementets indhold er stablet, betragtes hele elementet i stablingsrækkefølgen for den overordnede stablingskontekst. ref
1: der er nogle hacky måder, hvis vi overvejer brugen af ​​3D-transformation.
Eksempel med et element, der går under dets overordnede element, selvom dette har et z-indeks specificeret.
.boks {
position: relativ;
z-indeks: 0;
højde: 80px;
baggrund: blå;
transform-stil: preserve-3d; /* Dette er vigtigt */
}
.boks> div {
margen: 0 50px;
højde: 100px;
baggrund: rød;
z-indeks: -1; / * dette vil ikke gøre noget * /
transformere: translateZ (-1px); / * dette vil gøre magien* /
}
Et andet eksempel, hvor vi kan placere et element mellem to elementer i en anden stablingskontekst: .boks { position: relativ; z-indeks: 0; højde: 80px; baggrund: blå; } .boks> div { margen: 0 50px; højde: 100px; baggrund: rød; z-indeks: 5; transformere: translateZ (2px); } . udenfor { højde: 50px; baggrund: grøn; margen: -10px 40px; transformere: translateZ (1px); } krop { transform-stil: preserve-3d; }
Vi kan også have en skør stabelrækkefølge som nedenfor: .boks { bredde: 100px; højde: 100px; position: absolut; } krop { transform-stil: preserve-3d; }
Vi skal bemærke, at brug af sådan hack kan have en vis bivirkning på grund af det faktum, at transform-stil, perspektiv og transformation vil påvirke position: absolut / fast element. Relateret: CSS-filter på forælder bryder børns positionering 10 | En god måde at tænke på dette er, at hver forælder indeholder sin egen stablingskontekst. Søskendeelementer deler en forældres stable rækkefølge og kan derfor overlappe hinanden. Et underordnet element får ALTID en stablingskontekst baseret på dets overordnede. Derfor er behovet for en negativ z-indeksværdi for at skubbe barnet "bag" dets overordnede (0) stablingskontekst. Den eneste måde at fjerne et element fra forældrenes kontekst er at bruge position: fast, da dette i det væsentlige tvinger det til at bruge vinduet til kontekst. 1 | Mozilla-dokumentationen siger det Z-indekset CSS egenskab indstiller z-rækkefølgen af ​​et positioneret element og dets efterkommere eller flex-elementer. Her er nogle ekstra logik fra en anden StackOverflow-artikel, der vedrører børn vs efterkommere. 2 | Hvordan kan jeg forstå denne adfærd ved hjælp af logik? For mig er det svært at forstå dit problem ved hjælp af logik. En forælder indeholder sine børn. En skål kan dækkes af en anden skål. Men du kan ikke dække suppen med skålen, medmindre du lægger suppen ud af skålen. z-Index indstiller rækkefølgen for overlappende elementer. En forælder kan ikke overlappe sit barn. ImhO det er helt logisk. | Dit svar StackExchange.ifUsing ("editor", funktion () { StackExchange.using ("externalEditor", funktion () { StackExchange.using ("uddrag", funktion () { StackExchange.snippets.init (); }); }); }, "kodestykke"); StackExchange.ready (funktion () { var channelOptions = { tags: "" .split (""), id: "1" }; initTagRenderer ("". split (""), "" .split (""), channelOptions); StackExchange.using ("externalEditor", funktion () { // Skal redigere editoren efter uddrag, hvis uddrag er aktiveret hvis (StackExchange.settings.snippets.snippetsEnabled) { StackExchange.using ("uddrag", funktion () { createEditor (); }); } andet { createEditor (); } }); funktion createEditor () { StackExchange.prepareEditor ({ useStacksEditor: falsk, heartbeatType: 'svar', autoActivateHeartbeat: false, convertImagesToLinks: sand, noModals: sandt, showLowRepImageUploadWarning: true, reputToPostImages: 10, bindNavPrevention: true, postfix: "", imageUploader: { brandingHtml: "Drevet af \ u003ca href = \" https: //imgur.com/ \ "\ u003e \ u003csvg class = \" svg-icon \ "width = \" 50 \ "height = \" 18 \ "viewBox = \ "0 0 50 18 \" fill = \ "none \" xmlns = \ "http: //www.w3.org/2000/svg \" \ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.26454 46.2665 7.94324 47.1084 7.58816C47.4091 7.46349 47.7169 7.36433 48.0099 7.26993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.1414 4.61182C47.4335 4.61182 46.7256 4.916 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \" M32.492 10.1419C48.44.064.014 12.6 12.6 41.5985 12.6954 41.5985 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 10.8521 38.2696 11.5455 37.0451 11.545.5 521 35.4954 9.60062V6.59049C35.4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \ "/ \ u003e \ u003cpath fill-rule = \" evenodd \ "clip-rule = \" evend = \ "M25.6622 17.6335C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.9913.461.46 .1369 4.56087 21.0134 6.57349 21.0134 9.27932C21.0134 11.9852 23.003 13.913 25.3754 13.913C26.5612 13.913 27.4607 13.4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.779928,121 12.8346C28.1256 12,8854 28,1301 12,9342 28,1301 12.983C28.1301 14,4373 27,2502 15,2321 25,777 15.2321C24.8349 15,2321 24,1352 14,9821 23,5661 14.7787C23.176 14,6393 22,8472 14,5218 22,5437 14.5218C21.7977 14,5218 21,2429 15,0123 21,2429 15.6887C21.2429 16,7375 22,9072 17,6335 25,6622 17,6335 ZM24.1317 9.27932C24.1317 7.94324 24.9928 7.09766 26.1024 7.09766C27.2119 7.09766 28.0918 7.94324 28.0918 9.27932C28.0918 10.6321 27.2311 11.5116 26.1024 11.5116C24.9737 11.5116 24.1317 10.6491 24.131779 \ 3232 8045 11.9512C16.8045 13.2535 17.2637 13.8962 18.2965 13.8962C19.3298 13.8962 19.8079 13.2535 19.8079 11.9512V8.12928C19.8079 5.82936 18.4879 4.62866 16.4027 4.62866C15.1594 4.62866 14.279 4.98375 13.312.666 7.9466 5.5079C7.58314 4.9328 7.10506 4.66232 6.51203 4.66232C5.47873 4.66232 5.00066 5.28821 5.00066 6.59049V11.9512C5.00066 13.2535 5.47873 13.8962 6.51203 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.5104 6.91179 10.893 7.58817 10.893 8.94108V11.9512C10.893 13.2535 11.3711 13.8962 12.4013.413.796 13.82 6.91179C16.4027 6.91179 16.8045 7.58817 16.8045 8.94108V11.9512Z \ "/ \ u003e \ u003cpath d = \" M3.31675 6.59049C3.31675 5.28821 2.83866 4.66232 1.82471 4.66232C0.791758 4.66232 0.313354 5.221 13.8962 1.82471 13.8962C2.85798 13.8962 3.31675 13.2535 3.31675 11.9512V6.59049Z \ "/ \ u003e \ u003cpath d = \" M1.87209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.86667 3.5767 1.98861C3.7234 1.1159 2.90056 0.400291 1.87209 0.400291Z \ "fill = \" # 1BB76E \ "/ \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e", contentPolicyHtml: "Brugerbidrag licenseret under \ u003ca href = \" https: //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \" https://stackoverflow.com / legal / content-policy \ "\ u003e (content policy) \ u003c / a \ u003e", allowUrls: sandt }, onDemand: sandt, discardSelector: ".discard-answer" , straksShowMarkdownHelp: true, enableTables: true, enableSnippets: true }); } }); Tak for dit bidrag til Stack Overflow! Sørg for at besvare spørgsmålet. Giv detaljer og del din forskning! Men undgå ... At bede om hjælp, afklaring eller svar på andre svar. At afgive udsagn baseret på mening; sikkerhedskopier dem med referencer eller personlig erfaring. For at lære mere, se vores tip til at skrive gode svar. Kladde gemt Udkast kasseret Tilmeld dig eller log ind StackExchange.ready (funktion () { StackExchange.helpers.onClickDraftSave ('# login-link'); }); Tilmeld dig ved hjælp af Google Tilmeld dig via Facebook Tilmeld dig ved hjælp af e-mail og adgangskode Indsend Send som gæst Navn E-mail Påkrævet, men aldrig vist StackExchange.ready ( funktion () { StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f54897916% 2fwhy-cant-an-element-with-az-index-value-cover-its- barn% 23nyt-svar ',' spørgsmål_side '); } ); Send som gæst Navn E-mail Påkrævet, men aldrig vist Send dit svar Kassér Ved at klikke på "Send dit svar" accepterer du vores servicevilkår, fortrolighedspolitik og cookiepolitik Er det ikke det svar, du leder efter? Gennemse andre spørgsmål mærket css css-position z-index eller stil dit eget spørgsmål.